package com.easystudy.media.util;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

/**
 * @文件名称: FileUtil.java
 * @功能描述: 
 * @版权信息: www.easystudy.com
 * @技术交流: 961179337(QQ群)
 * @编写作者: lixx2048@163.com
 * @联系方式: 941415509(QQ)
 * @开发日期: 2020年10月30日
 * @历史版本: V1.0 
 * @备注信息: 
 * 		FileUtil.removePlaceHolder("D:/pom2.xml", "<!--xml-start", "end--!>");
 * 		FileUtil.replaceTextFile("D:/pom2.xml", "<REPLACE>", "</REPLACE>", "");
 * 		FileUtil.replaceTextFile("D:/pom2.xml", "<REPLACE>", "</REPLACE>", "<dependency>\r\n" + 
				"		<groupId>org.springframework.cloud</groupId>\r\n" + 
				"		<artifactId>spring-cloud-starter-openfeign</artifactId>\r\n" + 
				"		<version>2.1.2.RELEASE</version>\r\n" + 
				"	</dependency>");
 */
public class FileUtil {
	/**
	 * @功能描述: 获取磁盘列表
	 * @版权信息: www.easystudy.com
	 * @编写作者: lixx2048@163.com
	 * @开发日期: 2021年12月30日
	 * @备注信息: TODO
	 */
	public static List<String> getDiskList() {
		List<String> list = new ArrayList<String>();
		File[] roots = File.listRoots();
		for (File file : roots) {
			list.add(file.getPath());
		}
		return list;
	}
	
	/**
	 * @功能描述: 获取磁盘总空间
	 * @版权信息: www.easystudy.com
	 * @编写作者: lixx2048@163.com
	 * @开发日期: 2021年12月30日
	 * @备注信息: 大小返回为字节
	 */
	public static Map<String, Long> getDiskTotalSize() {
		Map<String, Long> map = new HashMap<String, Long>();
		File[] roots = File.listRoots();
		for (File file : roots) {
			Long size = file.getTotalSpace();
			map.put(file.getPath(), size);
		}
		return map;
	}
	
	/**
	 * @功能描述: 获取磁盘可用空间
	 * @版权信息: www.easystudy.com
	 * @编写作者: lixx2048@163.com
	 * @开发日期: 2021年12月30日
	 * @备注信息: 大小返回为字节
	 */
	public static Map<String, Long> getDiskFreeSize() {
		Map<String, Long> map = new HashMap<String, Long>();
		File[] roots = File.listRoots();
		for (File file : roots) {
			Long size = file.getFreeSpace();
			map.put(file.getPath(), size);
		}
		return map;
	}
	
	/**
	 * @功能描述: 本地文件创建一个http multipart文件
	 * @版权信息: www.easystudy.com
	 * @编写作者: lixx2048@163.com
	 * @开发日期: 2021年11月23日
	 * @备注信息: TODO
	 
	public static MultipartFile getMultipartFile(File file) throws IOException {
        FileItem fileItem = createFileItem(file);
        return new CommonsMultipartFile(fileItem);
    }
    
    public static MultipartFile getMultipartFile(String filePath) throws IOException {
        FileItem fileItem = createFileItem(new File(filePath));
        return new CommonsMultipartFile(fileItem);
    }
    */
	
	/**
	 * @功能描述: 检查网络地址是否有效
	 * @版权信息: www.easystudy.com
	 * @编写作者: lixx2048@163.com
	 * @开发日期: 2021年6月21日
	 * @备注信息:
	 */
	public static Boolean validUrl(String url) {
		try {
			HttpURLConnection.setFollowRedirects(false);
			HttpURLConnection con = (HttpURLConnection) new URL(url).openConnection();
			try {
				con.setRequestMethod("HEAD");
				return (con.getResponseCode() == HttpURLConnection.HTTP_OK);
			} finally {
				if (con != null) {
					con.disconnect();
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return false;
	}
	
	/**
	 * @功能描述: 保存数据到本地临时目录
	 * @版权信息: www.easystudy.com
	 * @编写作者: lixx2048@163.com
	 * @开发日期: 2021年6月21日
	 * @备注信息:
	 */
	public static String saveToLocal(byte[] content) throws Exception {
		FileOutputStream fos = null;
		String tempPath = System.getProperty("java.io.tmpdir");
		try {
			String file = java.util.UUID.randomUUID().toString();
			tempPath = slash(tempPath) + java.util.UUID.randomUUID().toString();
			File f = new File(file);
			if(f.exists()){
				f.delete();
			}

			fos = new FileOutputStream(tempPath);
			fos.write(content);
			fos.flush();
			return tempPath;
		} catch(Exception e){
			e.printStackTrace();
			return new String("");
		} finally {
			if(null != fos){
				fos.close();
			}
		}
	}
	
	/**
	 * @功能描述: 保存数据到本地临时目录
	 * @版权信息: www.easystudy.com
	 * @编写作者: lixx2048@163.com
	 * @开发日期: 2021年6月21日
	 * @备注信息:
	 */
	public static String saveTempFile(byte[] content, String fileName) throws Exception {
		FileOutputStream fos = null;
		String tempPath = System.getProperty("java.io.tmpdir");
		try {
			tempPath = slash(tempPath) + fileName;
			File f = new File(tempPath);
			if(f.exists()){
				f.delete();
			}
			
			fos = new FileOutputStream(tempPath);
			fos.write(content);
			fos.flush();
			return tempPath;
		} catch(Exception e){
			e.printStackTrace();
			return new String("");
		} finally {
			if(null != fos){
				fos.close();
			}
		}
	}
	
	/**
	 * @功能描述: 保存数据到本地临时目录
	 * @版权信息: www.easystudy.com
	 * @编写作者: lixx2048@163.com
	 * @开发日期: 2021年6月21日
	 * @备注信息:
	 */
	public static boolean saveToLocal(byte[] content, String filePath) throws Exception {
		FileOutputStream fos = null;
		try {
			File f = new File(filePath);
			if(f.exists()){
				f.delete();
			}
			fos = new FileOutputStream(f);
			fos.write(content);
			fos.flush();
			return true;
		} catch(Exception e){
			e.printStackTrace();
		} finally {
			if(null != fos){
				fos.close();
			}
		}
		return false;
	}
	
	/**
	 * @功能描述: 保存流到本地文件中
	 * @版权信息: www.easystudy.com
	 * @编写作者: lixx2048@163.com
	 * @开发日期: 2021年9月17日
	 * @备注信息: TODO
	 */
	public static boolean saveToLocal(InputStream in, String destFilePath) throws Exception {
		FileOutputStream fos = null;
		BufferedInputStream bis = null;
		
		byte[] buf = new byte[1024];
		int size = 0;
		try {
			// 输入输出
			bis = new BufferedInputStream(in);			
			fos = new FileOutputStream(destFilePath);
			// 写文件
			while ((size = bis.read(buf)) != -1) {
				fos.write(buf, 0, size);
			}
			// 刷新
			fos.flush();
			return true;
		} catch(Exception e){
			e.printStackTrace();
			return false;
		} finally {
			if(null != fos){
				fos.close();
			}
			if(null != bis){
				bis.close();
			}
		}
	}
	
	/**
	 * @功能描述: 为目录添加斜杠后缀
	 * @版权信息: www.easystudy.com
	 * @编写作者: lixx2048@163.com
	 * @开发日期: 2020年12月8日
	 * @备注信息:
	 */
	public static String slash(String dir) {
		dir = dir.trim();
		if (dir.endsWith("/") || dir.endsWith("\\")) {
			return dir;
		}
		return dir + File.separator;
	}
	
	/**
	 * @功能描述: 保存网络图片到本地
	 * @版权信息: www.easystudy.com
	 * @编写作者: lixx2048@163.com
	 * @开发日期: 2020年12月8日
	 * @备注信息:
	 */
	public static String saveToLocal(String destUrl) throws Exception {
		FileOutputStream fos = null;
		BufferedInputStream bis = null;
		HttpURLConnection httpUrl = null;
		
		String tempPath = System.getProperty("java.io.tmpdir");
		
		byte[] buf = new byte[1024];
		int size = 0;
		try {
			URL url = new URL(destUrl);
			httpUrl = (HttpURLConnection) url.openConnection();
			httpUrl.connect();
			
			bis = new BufferedInputStream(httpUrl.getInputStream());
			
			// 接口类型返回二进制图片数据
			// Content-disposition 是 MIME 协议的扩展，MIME 协议指示 MIME 
			// 用户代理如何显示附加的文件。当 Internet Explorer 接收到头时，它会激活文件下载对话框
			String file = httpUrl.getHeaderField("Content-Disposition");
			if(file != null && file.trim().length() > 0){
				int pos = file.indexOf("filename=");
				if(-1 != pos){
					file = file.substring(pos + "filename=".length());
					String[] names = file.split(";");
					if(names.length >= 1){
						file = names[0];
					}
					if(file.startsWith("\"")){
						file = file.substring(1);
					}
					if(file.endsWith("\"")){
						file = file.substring(0, file.length()-1);
					}
					file = file.trim();
				}
			}
			
			// 静态图片数据
			// http://localhost/1.jpg?id=12&xx=23
			if(file == null || file.isEmpty()){
				// 路径自带文件名
				int pos = destUrl.indexOf("?");
				if (pos != -1) {
					destUrl = destUrl.substring(0, pos);
				}
				pos = destUrl.lastIndexOf("/");
				if(pos != -1) {
					int pos2 = destUrl.lastIndexOf(".");
					if (pos2 != -1) {
						file = destUrl.substring(pos+1);
					}
				}
				// 随机生成目录
				if(file == null || file.isEmpty()) {
					file = java.util.UUID.randomUUID().toString();
				}				
			}
			
			// 删除本地文件
			tempPath = slash(tempPath) + file;
			File f = new File(file);
			if(f.exists()){
				f.delete();
			}

			// 写入文件内容
			fos = new FileOutputStream(tempPath);
			while ((size = bis.read(buf)) != -1) {
				fos.write(buf, 0, size);
			}
			fos.flush();
			return tempPath;
		} catch(Exception e){
			e.printStackTrace();
			return new String("");
		} finally {
			if(null != fos)
				fos.close();
			if(null != bis)
				bis.close();
			if(null != httpUrl)
				httpUrl.disconnect();
		}
	}
	
	/**
	 * @功能描述: 移除文件中占位符
	 * @版权信息: www.easystudy.com
	 * @编写作者: lixx2048@163.com
	 * @开发日期: 2020年10月29日
	 * @备注信息: 所有内容将加载到内容后替换-注意大文件使用
	 */
	public static void removePlaceHolder(String file, String startPlaceHolder, String endPlaceHolder) {
		FileReader fr = null;
		BufferedReader br = null;
		FileWriter out = null;
		
		try {
			fr = new FileReader(file);
			br = new BufferedReader(fr);
			
			boolean first = false, last = false;
			String result = "";
			String temp = "", reserver="", source = "";
			
			// 获取系统换行符
			String separator = System.lineSeparator();
			while ((source = br.readLine()) != null) {
				
				String line = source;
				
				// 第二次找到起始标签
				if (first && !last && line.indexOf(startPlaceHolder) != -1) {
					result += reserver;
					temp = "";
					reserver = "";
					
					reserver += line;
					reserver += separator;
					
					line = line.replace(startPlaceHolder, "");
					if (!line.isEmpty()) {
						temp += line;
						temp += separator;
					}
					continue;
				}
				
				// 找到起始点节点
				if (!first && !last && line.indexOf(startPlaceHolder) != -1) {
					reserver += line;
					line = line.replace(startPlaceHolder, "");
					first = true;
				}
				
				// 找到结束节点
				if (first && !last && line.indexOf(endPlaceHolder) != -1) {
					line = line.replace(endPlaceHolder, "");
					if (!line.trim().isEmpty()) {
						temp += line.trim();
						temp += separator;
					}
					result += temp;
					temp = "";
					reserver = "";
					
					first = false;
					last = false;
					continue;
				}
				
				// 开始行
				if (!first && !last) {
					result += line;
					result += separator;
				}
				
				// 中间行
				if (first && !last) {
					temp += line;
					temp += separator;
					reserver += line;
					reserver += separator;
				}
			}
			
			if (!temp.isEmpty()) {
				if (temp.endsWith(separator)) {
					int pos = temp.lastIndexOf(separator);
					temp = temp.substring(0, pos);
				}
			}
			
			result += temp;
			br.close();
			fr.close();
			
			out = new FileWriter(file);
			out.write(result);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if(br != null) {
				try {
					br.close();
				} catch (IOException e1) {
					e1.printStackTrace();
				}
			}
			if (fr != null) {
				try {
					fr.close();
				} catch (IOException e1) {
					e1.printStackTrace();
				}
			}
			if (out != null) {
				try {
					out.close();
				} catch (IOException e1) {
					e1.printStackTrace();
				}
			}
		}
	}
	
	/**
	 * @功能描述: 替换占位符内部文本
	 * @版权信息: www.easystudy.com
	 * @编写作者: lixx2048@163.com
	 * @开发日期: 2020年10月30日
	 * @备注信息:
	 */
	public static void replaceTextFile(String file, String startPlaceHolder, String endPlaceHolder, String content) {
		FileReader fr = null;
		BufferedReader br = null;
		FileWriter out = null;
		
		try {
			fr = new FileReader(file);
			br = new BufferedReader(fr);
			
			boolean first = false, last = false;
			String result = "";
			String temp = "", reserver="", source = "";
			
			// 获取系统换行符
			String separator = System.lineSeparator();
			while ((source = br.readLine()) != null) {
				
				String line = source;
				
				// 第二次找到起始标签
				if (first && !last && line.indexOf(startPlaceHolder) != -1) {
					result += reserver;
					temp = "";
					reserver = "";
					
					reserver += line;
					reserver += separator;
					
					int pos = line.indexOf(startPlaceHolder);
					if (pos != -1) {
						temp += line.substring(0, pos);
					}
					pos = line.indexOf(endPlaceHolder);
					if (pos != -1) {
						temp +=line.substring(pos+endPlaceHolder.length());
					}
					temp += separator;
					continue;
				}
				
				// 找到起始点节点
				if (!first && !last && line.indexOf(startPlaceHolder) != -1) {
					reserver += line;
					int pos = line.indexOf(startPlaceHolder);
					if (pos != -1) {
						temp += line.substring(0, pos);
					}
					first = true;
				}
				
				// 找到结束节点
				if (first && !last && line.indexOf(endPlaceHolder) != -1) {
					
					temp += content;
					int pos = line.indexOf(endPlaceHolder);
					if (pos != -1) {
						temp += line.substring(pos+endPlaceHolder.length());
					}
					temp += separator;
					
					result += temp;
					temp = "";
					reserver = "";
					
					first = false;
					last = false;
					continue;
				}
				
				// 开始行
				if (!first && !last) {
					result += line;
					result += separator;
				}
				
				// 中间行
				if (first && !last) {
					reserver += line;
					reserver += separator;
				}
			}
			
			if (!temp.isEmpty()) {
				if (temp.endsWith(separator)) {
					int pos = temp.lastIndexOf(separator);
					temp = temp.substring(0, pos);
				}
			}
			
			result += temp;
			br.close();
			fr.close();
			
			out = new FileWriter(file);
			out.write(result);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if(br != null) {
				try {
					br.close();
				} catch (IOException e1) {
					e1.printStackTrace();
				}
			}
			if (fr != null) {
				try {
					fr.close();
				} catch (IOException e1) {
					e1.printStackTrace();
				}
			}
			if (out != null) {
				try {
					out.close();
				} catch (IOException e1) {
					e1.printStackTrace();
				}
			}
		}
	}
	
	/**
	 * @功能描述: 获取临时文件路径
	 * @版权信息: www.easystudy.com
	 * @编写作者: lixx2048@163.com
	 * @开发日期: 2020年10月21日
	 * @备注信息: 后缀名如".jpg"
	 */
	public static File createTempFile(String suffix) {
		File file = null;
		try {
			file = File.createTempFile(UUID.randomUUID().toString().replace("-", ""), suffix);
		} catch (IOException e) {
			e.printStackTrace();
		}
		return file;
	}
	
	/**
	 * @功能描述: 将数据写入文件中
	 * @版权信息: www.easystudy.com
	 * @编写作者: lixx2048@163.com
	 * @开发日期: 2020年10月21日
	 * @备注信息:
	 */
	public static void writeToFile(byte[] data, File file) {
		FileOutputStream out = null;
		try {
			out = new FileOutputStream(file);
			try {
				out.write(data);
			} catch (IOException e) {
				e.printStackTrace();
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} finally {
			if (out != null) {
				try {
					out.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
	
	/**
	 * @功能描述: 读取文件内容
	 * @版权信息: www.easystudy.com
	 * @编写作者: lixx2048@163.com
	 * @开发日期: 2020年10月21日
	 * @备注信息:
	 */
	public static byte[] readFile(File file) {
		byte[] buffer = null;
		FileInputStream in = null;
		try {
			in = new FileInputStream(file);
			try {
				long length = file.length();
				buffer = new byte[(int) length];
				in.read(buffer);
			} catch (Exception e) {
				e.printStackTrace();
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} finally {
			if (in != null) {
				try {
					in.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		return buffer;
	}
	
	/**
	 * @功能描述: 读取指定偏移量大小的文件内容
	 * @版权信息: www.easystudy.com
	 * @编写作者: lixx2048@163.com
	 * @开发日期: 2020年10月21日
	 * @备注信息: start=-1从0开始，end=-1读取到最后
	 */
	public static byte[] readFile(File file, int start, int end) {
		// 随机文件读取
		byte[] result = null;
		RandomAccessFile in = null;
		try {
			in = new RandomAccessFile(file, "r");
			
			// 定位偏移量
			if (-1 == start) {
				start = 0;
			}
			if (start >= file.length() - 1) {
				start = (int) (file.length() - 1);
			}
			in.seek(start);
			
			// range=0-10
			long len = file.length() - start;
			if (end != -1) {
				len = end - start;
			} 
			
			int size = 1*1024*1024;
			int batch = (int)(len < size ? len: size);
			byte[] bytes = new byte[batch];
			int total = 0;int pos = 0;
			while (true) {
				// 读取流
				int real = in.read(bytes);
				if (real <= 0) {
					break;
				}
				
				// 追加数据
				if (null == result) {
					result = new byte[real];
					System.arraycopy(bytes, 0, result, 0, real);
				} else {
					byte[] temp = new byte[pos + real];
					System.arraycopy(result, 0, temp, 0, pos);
					System.arraycopy(bytes, 0, temp, pos, real);
					result = temp;
					temp = null;
				}
				pos += real;
				
				// 读取完成
				total += real;
				if (total >= len) {
					break;
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (in != null) {
				try {
					in.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		
		return result;
	}
	
	/**
	 * @功能描述: 获取静态资源目录
	 * @版权信息: www.easystudy.com
	 * @编写作者: lixx2048@163.com
	 * @开发日期: 2020年10月21日
	 * @备注信息:
	 */
	public static String getUploadDir() {
		String dir = "";
		String OS = System.getProperty("os.name").toLowerCase();
		if (OS.indexOf("linux") >= 0) {
			dir = "/Users/upload/";
		} else if(OS.indexOf("windows") >= 0){
			dir = "C:/upload/";
		}
		FileUtil.mkdirs(dir);
		return dir;
	}
	
	/**
	 * @功能描述: 判断操作系统类型
	 * @版权信息: www.easystudy.com
	 * @编写作者: lixx2048@163.com
	 * @开发日期: 2020年10月29日
	 * @备注信息:
	 */
	public static boolean isLinux() {
		boolean flag = false;
		String OS = System.getProperty("os.name").toLowerCase();
		if (OS.indexOf("linux") >= 0) {
			flag = true;
		} else if(OS.indexOf("windows") >= 0){
			flag = false;
		}
		return flag;
	}
	
	/**
	 * @功能描述: 创建目录
	 * @版权信息: www.easystudy.com
	 * @编写作者: lixx2048@163.com
	 * @开发日期: 2020年10月19日
	 * @备注信息:
	 */
	public static boolean mkdirs(String dir) {
		return new File(dir).mkdirs();
	}
	
	/**
	 * @功能描述: 将存放在sourceFilePath目录下的源文件打包成fileName名称的zip文件，并存放到zipFilePath路径下
	 * @版权信息: www.easystudy.com
	 * @编写作者: lixx2048@163.com
	 * @开发日期: 2020年10月16日
	 * @备注信息: 
	 * 	sourceDir	:待压缩的文件路径
	 *  zipFilePath	:压缩后存放路径
	 *  fileName	:压缩后文件的名称
	 */
    public static boolean fileToZip(String sourceDir, String zipFilePath, String fileName, boolean removeIfExists) throws IOException {
        boolean flag = false;
        File sourceFile = new File(sourceDir);
        
        FileInputStream fis = null;
        BufferedInputStream bis = null;
        FileOutputStream fos = null;
        ZipOutputStream zos = null;
 
        if (sourceFile.exists() == false) {
            System.out.println("待压缩的文件目录：" + sourceDir + "不存在.");
        } else {
            try {
                File zipFile = new File(zipFilePath + fileName + ".zip");
                if (zipFile.exists()) {
                	if (!removeIfExists) {
                		System.out.println(zipFilePath + "目录下存在名字为:" + fileName + ".zip" + "打包文件.");
                		return flag;
					}
                	zipFile.delete();
                }
                
                File[] sourceFiles = sourceFile.listFiles();
                if (null == sourceFiles || sourceFiles.length < 1) {
                    System.out.println("待压缩的文件目录：" + sourceDir + "里面不存在文件，无需压缩.");
                } else {
                    fos = new FileOutputStream(zipFile);
                    zos = new ZipOutputStream(new BufferedOutputStream(fos));
                    byte[] bufs = new byte[1024 * 10];
                    addFile(sourceFile, zos, fis, bis, bufs, sourceDir);
                    flag = true;
                    if (null != zos) {
                        zos.closeEntry();
                        zos.close();
                    }
                }
            } catch (FileNotFoundException e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            } catch (IOException e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            } finally {
                //关闭流  
                try {
                    if (null != fis) {
                        fis.close();
                    }
                    if (null != fos) {
                        fos.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                    throw new RuntimeException(e);
                }
            }
        }
        return flag;
    }
 
    /**
     * 遍历文件夹，放到zip输出流中去
     * @param source
     * @param zos
     * @param fis
     * @param bis
     * @param bufs
     * @throws IOException
     */
    private static void addFile(File source, ZipOutputStream zos, FileInputStream fis, BufferedInputStream bis, byte[] bufs, String basePath) throws IOException {
        File[] childes = source.listFiles();
        for (File file : childes) {
            if (file.isFile()) {
                // 创建ZIP实体，并添加进压缩包
                ZipEntry zipEntry = new ZipEntry(remove(file.getAbsolutePath().toString(), basePath).substring(1));
                // 子文件名称不能相同，会报错
                zos.putNextEntry(zipEntry);
                // 读取待压缩的文件并写进压缩包里
                fis = new FileInputStream(file);
                bis = new BufferedInputStream(fis, 1024 * 10);
                int read = 0;
                while ((read = bis.read(bufs, 0, 1024 * 10)) != -1) {
                    zos.write(bufs, 0, read);
                }
                if (null != bis) {
                    bis.close();
                }
            } else {
                addFile(file, zos, fis, bis, bufs, basePath);
            }
        }
    }
    
    private static String remove(String source, String rmv) {
    	source = source.replace("\\", "/");
    	rmv = rmv.replace("\\", "/");
    	if (!source.startsWith("/") && rmv.startsWith("/")) {
    		rmv = rmv.substring(1);
		}
    	String path = source.replaceAll(rmv, "");
    	return path;
    }
 
    /**
     * @功能描述: 迭代删除文件夹
     * @版权信息: www.easystudy.com
     * @编写作者: lixx2048@163.com
     * @开发日期: 2020年10月16日
     * @备注信息:
     */
    public static void deleteDir(String dirPath) {
        File file = new File(dirPath);
        if (file.isFile()) {
            file.delete();
        } else {
            File[] files = file.listFiles();
            if (files == null) {
                file.delete();
            } else {
                for (int i = 0; i < files.length; i++) {
                    deleteDir(files[i].getAbsolutePath());
                }
                file.delete();
            }
        }
    }

	/**
	 * @功能描述: 拷贝文件到指定目录
	 * @版权信息: www.easystudy.com
	 * @编写作者: lixx2048@163.com
	 * @开发日期: 2020年10月16日
	 * @备注信息:
	 */
	static public void copy(File file, String dir) throws IOException {
		String newFileName = dir + "/" + file.getName();
		File newFile = new File(newFileName);
		Files.copy(file.toPath(), newFile.toPath());
	}
	
	/**
	 * @功能描述: 拷贝整个目录
	 * @版权信息: www.easystudy.com
	 * @编写作者: lixx2048@163.com
	 * @开发日期: 2022年1月11日
	 * @备注信息: TODO
	 */
	public static void copyFolder(String oldPath, String newPath) {
		try {
			// 如果文件夹不存在 则建立新文件夹
			(new File(newPath)).mkdirs(); 
			File a = new File(oldPath);
			String[] file = a.list();
			
			File temp = null;
			for (int i = 0; i < file.length; i++) {
				if (oldPath.endsWith(File.separator)) {
					temp = new File(oldPath + file[i]);
				} else {
					temp = new File(oldPath + File.separator + file[i]);
				}

				// 如果是文件
				if (temp.isFile()) {
					FileInputStream input = new FileInputStream(temp);
					FileOutputStream output = new FileOutputStream(newPath + "/" + (temp.getName()).toString());
					byte[] b = new byte[1024 * 5];
					int len;
					while ((len = input.read(b)) != -1) {
						output.write(b, 0, len);
					}
					output.flush();
					output.close();
					input.close();
				// 如果文件夹
				} else if (temp.isDirectory()) {
					copyFolder(oldPath + "/" + file[i], newPath + "/" + file[i]);
				}
			}
		} catch (Exception e) {
			System.out.println("复制整个文件夹内容操作出错");
			e.printStackTrace();
		}
	}
	
	/**
	 * @功能描述: 拷贝流到新文件中
	 * @版权信息: www.easystudy.com
	 * @编写作者: lixx2048@163.com
	 * @开发日期: 2020年10月19日
	 * @备注信息:
	 */
	static public void copy(InputStream stream, String newFileName){
		File newFile = new File(newFileName);
		
		OutputStream out = null;
		try {
			out = new FileOutputStream(newFile);
			
			byte[] buffer = new byte[1024];
			while (true) {
				int count = stream.read(buffer);
				if (count <= 0) {
					break;
				}
				out.write(buffer, 0, count);
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (out != null) {
				try {
					out.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if (stream != null) {
				try {
					stream.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
	
	/**
	 * @功能描述: 生产环境下只能使用流的形式,jar打包后无法找到文件
	 * @版权信息: www.easystudy.com
	 * @编写作者: lixx2048@163.com
	 * @开发日期: 2020年10月19日
	 * @备注信息:
	 */
	static public void replace(InputStream stream, List<String> sources, List<String> dests, String destFileName) throws IOException {
		assert(sources.size() == dests.size());
		
		File newFile = new File(destFileName);

		InputStreamReader reader = null;
		BufferedReader bf = null;
		FileWriter writer = null;

		try {
			reader = new InputStreamReader(stream);
			bf = new BufferedReader(reader);
			writer = new FileWriter(newFile);

			String line = null;
			while ((line = bf.readLine()) != null) {
				for (int i = 0; i < sources.size(); i++) {
					String source = sources.get(i);
					String dest = dests.get(i);
					if (line.indexOf(source) != -1) {
						line = line.replaceAll(source, dest);
					}
				}				
				writer.write(line + System.lineSeparator());
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (reader != null) {
				try {
					reader.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if (bf != null) {
				try {
					bf.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if (writer != null) {
				try {
					writer.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
	
	/**
	 * @功能描述: 替换文件多处内容并保存到指定目录
	 * @版权信息: www.easystudy.com
	 * @编写作者: lixx2048@163.com
	 * @开发日期: 2020年10月16日
	 * @备注信息:
	 */
	static public void replace(File file, List<String> sources, List<String> dests, String dir) throws IOException {
		assert(sources.size() == dests.size());
		
		String original = dir + "/" + file.getName();
		String newFileName = dir + "/" + file.getName() + ".bak";
		File newFile = new File(newFileName);
		Files.copy(file.toPath(), newFile.toPath());

		FileReader reader = null;
		BufferedReader bf = null;
		FileWriter writer = null;
		boolean success = false;
		try {
			reader = new FileReader(file);
			bf = new BufferedReader(reader);
			writer = new FileWriter(newFile);

			String line = null;
			while ((line = bf.readLine()) != null) {
				for (int i = 0; i < sources.size(); i++) {
					String source = sources.get(i);
					String dest = dests.get(i);
					if (line.indexOf(source) != -1) {
						line = line.replaceAll(source, dest);
					}
				}				
				writer.write(line + System.lineSeparator());
			}
			success = true;
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (reader != null) {
				try {
					reader.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if (bf != null) {
				try {
					bf.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if (writer != null) {
				try {
					writer.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if (success) {
				newFile.renameTo(new File(original));
			}
		}
	}

	/**
	 * @功能描述: 替换文件内容并保存到新文件中
	 * @版权信息: www.easystudy.com
	 * @编写作者: lixx2048@163.com
	 * @开发日期: 2020年10月16日
	 * @备注信息:
	 */
	static public void replace(File file, String source, String dest, File newFile) throws IOException {
		
		if(!newFile.getParentFile().exists()) {
			newFile.getParentFile().mkdirs();
		}
		if (!newFile.exists()) {
			newFile.createNewFile();
		}

		FileReader reader = null;
		BufferedReader bf = null;
		FileWriter writer = null;
		try {
			reader = new FileReader(file);
			bf = new BufferedReader(reader);
			writer = new FileWriter(newFile);

			String line = null;
			while ((line = bf.readLine()) != null) {
				if (line.indexOf(source) != -1) {
					line = line.replaceAll(source, dest);
				}
				writer.write(line + System.lineSeparator());
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (reader != null) {
				try {
					reader.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if (bf != null) {
				try {
					bf.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if (writer != null) {
				try {
					writer.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
}
